home *** CD-ROM | disk | FTP | other *** search
- // the implementation of CKBANView
- // Copyright (C) 1997 Kazutaka Hirata <khirata@jove.acs.unt.edu>
-
- #include "stdafx.h"
-
- #include <string.h>
- #include "cmd/edpndlg.h"
- #include "view/aptpin.h"
- #include "view/aptline.h"
- #include "view/setgrid.h"
- #include "draw.h"
- #include "memdc.h"
- #include "resource.h"
-
- #include "kbanview.h"
-
- IMPLEMENT_DYNCREATE(CKBANView, CScrollView)
-
- BEGIN_MESSAGE_MAP(CKBANView, CScrollView)
- ON_WM_ERASEBKGND()
- ON_WM_KEYDOWN()
- ON_WM_KEYUP()
- ON_WM_CHAR()
- ON_WM_MOUSEMOVE()
- ON_WM_LBUTTONUP()
- ON_WM_LBUTTONDOWN()
- ON_WM_RBUTTONUP()
- ON_WM_RBUTTONDOWN()
- ON_WM_SIZE()
- ON_WM_MOVE()
- ON_WM_VSCROLL()
- ON_WM_HSCROLL()
-
- // edit
- ON_COMMAND (ID_EDIT_UNDO , OnUndo )
- ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO , OnUpdateUndo )
- ON_COMMAND (ID_EDIT_REDO , OnRedo )
- ON_UPDATE_COMMAND_UI(ID_EDIT_REDO , OnUpdateRedo )
- ON_COMMAND_RANGE (ID_EDIT_BLOCK , ID_EDIT_BLOCK , OnChangeCommand )
- ON_COMMAND_RANGE (ID_EDIT_BLOCK_LAYER , ID_EDIT_BLOCK_LAYER, OnChangeCommand )
- ON_COMMAND_RANGE (ID_EDIT_CUT , ID_EDIT_CUT , OnEditCutCopyDelete )
- ON_UPDATE_COMMAND_UI(ID_EDIT_CUT , OnUpdateCutCopyDelete)
- ON_COMMAND_RANGE (ID_EDIT_COPY , ID_EDIT_COPY , OnEditCutCopyDelete )
- ON_UPDATE_COMMAND_UI(ID_EDIT_COPY , OnUpdateCutCopyDelete)
- ON_COMMAND_RANGE (ID_EDIT_DELETE , ID_EDIT_DELETE , OnEditCutCopyDelete )
- ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE , OnUpdateCutCopyDelete)
- ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE , OnUpdatePaste )
- ON_COMMAND_RANGE (ID_EDIT_PASTE , ID_EDIT_PASTE , OnChangeCommand )
- ON_COMMAND (ID_EDIT_UNSELECT_ALL , OnEditUnselectAll )
- ON_UPDATE_COMMAND_UI(ID_EDIT_UNSELECT_ALL , OnUpdateUnselectAll )
- ON_COMMAND_RANGE (ID_EDIT_PIN , ID_EDIT_MOVE_LINE , OnChangeCommand )
-
- // layer
- ON_COMMAND_RANGE (ID_LAYER_PCOMMON , ID_LAYER_SBOTTOM , OnChangeLayer )
- ON_UPDATE_COMMAND_UI_RANGE(ID_LAYER_PCOMMON , ID_LAYER_SBOTTOM , OnUpdateLayer )
- ON_COMMAND_RANGE (ID_LAYER_SHOW_PCOMMON, ID_LAYER_SHOW_SBOTTOM, OnChangeShowLayer)
- ON_UPDATE_COMMAND_UI_RANGE(ID_LAYER_SHOW_PCOMMON, ID_LAYER_SHOW_SBOTTOM, OnUpdateShowLayer)
-
- // view
- ON_COMMAND_RANGE(ID_VIEW_ZOOMIN, ID_VIEW_ZOOMOUT, OnZoomCore)
- ON_COMMAND_RANGE(ID_VIEW_ALL , ID_VIEW_ALL , OnZoomCore)
- ON_COMMAND (ID_VIEW_REDRAW , OnRedraw )
-
- // setup
- ON_COMMAND (ID_SETUP_SNAP , OnChangeSnap )
- ON_UPDATE_COMMAND_UI (ID_SETUP_SNAP , OnUpdateSnap )
- ON_COMMAND (ID_SETUP_PIN_ON_COMMON, OnChangePinOnCommon)
- ON_UPDATE_COMMAND_UI (ID_SETUP_PIN_ON_COMMON, OnUpdatePinOnCommon)
- ON_COMMAND (ID_SETUP_FILL , OnChangeFill )
- ON_UPDATE_COMMAND_UI (ID_SETUP_FILL , OnUpdateFill )
- ON_COMMAND (ID_SETUP_HOLE , OnChangeHole )
- ON_UPDATE_COMMAND_UI (ID_SETUP_HOLE , OnUpdateHole )
- ON_COMMAND (ID_HELP_DEBUG , OnHelpDebug )
- ON_COMMAND_RANGE (ID_SETUP_GRID_10_1 , ID_SETUP_GRID_25_A, OnChangeGrid)
- ON_UPDATE_COMMAND_UI_RANGE(ID_SETUP_GRID_10_1 , ID_SETUP_GRID_25_A, OnUpdateGrid)
- ON_COMMAND (ID_SETUP_GRID_RESET , OnResetGrid )
- ON_COMMAND_RANGE (ID_SETUP_GRID_ORIGIN , ID_SETUP_GRID_ORIGIN, OnChangeCommand)
- ON_COMMAND (ID_SETUP_GRID_WIDTH , OnSetGridWidth )
- ON_COMMAND (ID_SETUP_APT_PIN , OnAptPin )
- ON_COMMAND (ID_SETUP_APT_LINE , OnAptLine )
-
- // tools & help
- ON_COMMAND(ID_TOOLS_PURGE , OnToolsPurge)
- ON_COMMAND(ID_HELP_ISEMPTY, OnIsEmpty )
-
- // place & delete
- ON_COMMAND_RANGE(ID_PLACE_PIN , ID_PLACE_COMPONENT , OnChangeCommand)
- ON_COMMAND_RANGE(ID_DELETE_PIN, ID_DELETE_COMPONENT, OnChangeCommand)
-
- // context menu
- ON_COMMAND(ID_CTXT_EDIT_PIN , OnContextEditPin )
- ON_COMMAND(ID_CTXT_SELECT_PIN , OnContextSelectPin )
- ON_COMMAND(ID_CTXT_UNSELECT_PIN , OnContextUnselectPin )
- ON_COMMAND(ID_CTXT_SELECT_LINE , OnContextSelectLine )
- ON_COMMAND(ID_CTXT_UNSELECT_LINE , OnContextUnselectLine )
- ON_COMMAND(ID_CTXT_SELECT_COMPONENT , OnContextSelectComponent )
- ON_COMMAND(ID_CTXT_UNSELECT_COMPONENT, OnContextUnselectComponent)
-
- // status bar
- ON_UPDATE_COMMAND_UI(ID_INDICATOR_X , OnUpdateIndicatorX )
- ON_UPDATE_COMMAND_UI(ID_INDICATOR_Y , OnUpdateIndicatorY )
- ON_UPDATE_COMMAND_UI(ID_INDICATOR_LAYER , OnUpdateIndicatorLayer )
- ON_UPDATE_COMMAND_UI(ID_INDICATOR_ZOOM , OnUpdateIndicatorZoom )
- ON_UPDATE_COMMAND_UI(ID_INDICATOR_GRID , OnUpdateIndicatorGrid )
- ON_UPDATE_COMMAND_UI(ID_INDICATOR_COMMAND, OnUpdateIndicatorCommand)
- END_MESSAGE_MAP()
-
- CKBANView::CKBANView()
- : CScrollView(),
- m_moved(FALSE),
- m_nGridID(ID_SETUP_GRID_25_1),
- m_nLayerID(ID_LAYER_PTOP)
- {
- m_bDisableRedraw = false;
- }
-
- void CKBANView::OnInitialUpdate()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- info.active_layer().pin_on_common().set(true);
-
- for(uint i = 0; i < LAYER_NUMBER; i++) {
- info.lflags()[i] = true;
- }
- info.grid().zoom_set(50);
- const XY& pc_design_size = info.grid().get_pc_design_size();
- SetScrollSizes(MM_TEXT, CSize(pc_design_size.x(), pc_design_size.y()));
- ScrollToPosition(CPoint(0, pc_design_size.y()));
-
- if(!info.apt_pin_table().is_included(info.apt_pin())) {
- info.apt_pin_table().push_back(info.apt_pin());
- }
- if(!info.apt_line_table().is_included(info.apt_line())) {
- info.apt_line_table().push_back(info.apt_line());
- }
-
- CClientDC dc(this);
- m_current_mmi = &m_default_func;
- KBAN_DRAW draw(&dc, info.grid(), info.fill(), info.hole(), info.lflags());
- m_current_mmi->init(info, draw);
-
- OnZoomCore(ID_VIEW_ALL);
-
- GetDocument()->SetNewState("");
- GetDocument()->ClearHistory();
-
- CScrollView::OnInitialUpdate();
- }
-
- BOOL CKBANView::OnEraseBkgnd(CDC* pDC)
- {
- if(m_bDisableRedraw) {
- return TRUE;
- }
-
- CRect rect;
- pDC->GetClipBox(&rect);
- pDC->FillSolidRect(&rect, RGB(0, 0, 0));
-
- return TRUE;
- }
-
- void CKBANView::OnDraw(CDC* pDC)
- {
- if(m_bDisableRedraw) {
- return;
- }
-
- KBAN_INFO& info = GetDocument()->kban_info();
- #if 1
- KBAN_DRAW draw(pDC, info.grid(), info.fill(), info.hole(), info.lflags());
- #else
- const XY& pc_win_size = info.grid().get_pc_win_size();
- CMemoryDC memDC(pDC, pc_win_size.x(), pc_win_size.y(), 16);
- memDC.SetViewportOrg(pDC->GetViewportOrg());
- CRect rcClip;
- memDC.GetClipBox(&rcClip);
- memDC.FillSolidRect(&rcClip, RGB(0, 0, 0));
- KBAN_DRAW draw(&memDC, info.grid(), info.fill(), info.hole());
- #endif
- draw.draw_grid();
- KBAN_DATA& kban_data = info.kban_data();
- uint active_layer = info.active_layer().get();
- draw.draw_kban_data(kban_data, active_layer);
-
- if(info.bSelected()) {
- KBAN_DATA& kban_data = info.kban_data();
- KBAN_DATA kban_data_selected;
- kban_data.collect_selected_items(kban_data_selected);
- draw.draw_kban_data_target(kban_data_selected, active_layer);
- }
-
- m_current_mmi->redraw(info, draw);
- #if 1
- #else
- pDC->BitBlt(
- rcClip.left,
- rcClip.top ,
- rcClip.right - rcClip.left,
- rcClip.bottom - rcClip.top ,
- &memDC,
- rcClip.left,
- rcClip.top ,
- SRCCOPY
- );
- #endif
- if(m_moved) {
- CPoint point(m_dc_old.x(), m_dc_old.y());
- pDC->DPtoLP(&point);
- XY pc_old(point.x, point.y);
- m_current_mmi->mouse_move(info, draw, pc_old, 0);
- }
- }
-
- #define PREPARE() \
- CClientDC dc(this); \
- OnPrepareDC(&dc); \
- KBAN_INFO& info = GetDocument()->kban_info(); \
- KBAN_DRAW draw(&dc, info.grid(), info.fill(), info.hole(), info.lflags());
-
- void CKBANView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- PREPARE();
- switch(nChar) {
- case VK_UP : OnChar(nChar, nRepCnt, nFlags); break;
- case VK_DOWN : OnChar(nChar, nRepCnt, nFlags); break;
- case VK_LEFT : OnChar(nChar, nRepCnt, nFlags); break;
- case VK_RIGHT : OnChar(nChar, nRepCnt, nFlags); break;
- case VK_SHIFT : {
- if((nFlags & 0x4000) == 0) { // not pressed previously
- m_current_mmi->shift_down(info, draw);
- }
- break;
- }
- case VK_CONTROL : {
- if((nFlags & 0x4000) == 0) { // not pressed previously
- m_current_mmi->control_down(info, draw);
- }
- break;
- }
- }
- }
-
- void CKBANView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- PREPARE();
- switch(nChar) {
- case VK_SHIFT : {
- if((nFlags & 0x8000) != 0) { // being released
- m_current_mmi->shift_up(info, draw);
- }
- break;
- }
- case VK_CONTROL : {
- if((nFlags & 0x8000) != 0) { // being released
- m_current_mmi->control_up(info, draw);
- }
- break;
- }
- }
- }
-
- void CKBANView::OnScrollCore(SCROLL_DIRECTION sd)
- {
- CPoint point = GetScrollPosition();
- KBAN_INFO& info = GetDocument()->kban_info();
- const XY& pc_win_size = info.grid().get_pc_win_size();
- switch(sd) {
- case SCROLL_UP : point.y -= pc_win_size.y() / 4; break;
- case SCROLL_DOWN : point.y += pc_win_size.y() / 4; break;
- case SCROLL_LEFT : point.x -= pc_win_size.x() / 4; break;
- case SCROLL_RIGHT : point.x += pc_win_size.x() / 4; break;
- }
- ScrollToPosition(point);
- Invalidate();
- }
-
- void CKBANView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- for(int i = 0; i < HIDDEN_STRING_LEN - 1; i++) {
- m_hidden_string[i] = m_hidden_string[i + 1];
- }
- m_hidden_string[i] = (char)nChar;
- if(!strnicmp(&m_hidden_string[HIDDEN_STRING_LEN - 6], "noodle", 6)) {
- MessageBox("Why don't you eat a cup noodle?", "Advertisement");
- }
- if(!strnicmp(&m_hidden_string[HIDDEN_STRING_LEN - 4], "kban", 4)) {
- MessageBox("Yes. I'm here.", "Identification");
- }
- if(!strnicmp(&m_hidden_string[HIDDEN_STRING_LEN - 4], "koji", 4)) {
- MessageBox("Thank you for writing ECO_PCB.", "Acknowledgement");
- }
-
- PREPARE();
- switch(nChar) {
- case VK_UP : OnScrollCore(SCROLL_UP ); break;
- case VK_DOWN : OnScrollCore(SCROLL_DOWN ); break;
- case VK_LEFT : OnScrollCore(SCROLL_LEFT ); break;
- case VK_RIGHT : OnScrollCore(SCROLL_RIGHT); break;
- case ' ' : Invalidate(); break;
- case '+' : OnZoomCore(ID_VIEW_ZOOMIN ); break;
- case '-' : OnZoomCore(ID_VIEW_ZOOMOUT); break;
- case 'f' : OnChangeFill(); break;
- case 'h' : OnChangeHole(); break;
- case '0' : OnChangeGrid(ID_SETUP_GRID_25_A); break;
- case '1' : OnChangeGrid(ID_SETUP_GRID_25_1); break;
- case '2' : OnChangeGrid(ID_SETUP_GRID_25_2); break;
- case '4' : OnChangeGrid(ID_SETUP_GRID_25_4); break;
- case '5' : OnChangeGrid(ID_SETUP_GRID_25_5); break;
- default : m_current_mmi->key_in(info, draw, nChar, nFlags); break;
- }
- }
-
- void CKBANView::ChangeCommandCore(KBAN_INFO& info, KBAN_DRAW& draw, KBAN_FUNCTION* func)
- {
- m_current_mmi->end(info, draw);
- m_current_mmi = func;
- if(m_current_mmi->init(info, draw) == MENU_END) {
- m_current_mmi = &m_default_func;
- m_current_mmi->init(info, draw);
- }
- m_current_mmi->mouse_move(info, draw, m_pc_old, 0);
- }
-
- void CKBANView::OnMouseGeneral(UINT nFlags, CPoint point, MOUSE_FUNC func)
- {
- PREPARE();
- m_moved = TRUE;
- m_dc_old.set(point.x, point.y);
- dc.DPtoLP(&point);
- m_pc_old.set(point.x, point.y);
- XY pc(point.x, point.y);
-
- info.new_state().set(false);
- if((m_current_mmi->*func)(info, draw, pc, nFlags) == FALSE) {
- ChangeCommandCore(info, draw, &m_default_func);
- }
- if(info.new_state().get()) {
- GetDocument()->SetNewState(info.new_state_str().c_str());
- }
- }
-
- void CKBANView::OnMouseMove(UINT nFlags, CPoint point)
- {
- OnMouseGeneral(nFlags, point, KBAN_FUNCTION::mouse_move);
- }
-
- void CKBANView::OnLButtonUp(UINT nFlags, CPoint point)
- {
- OnMouseGeneral(nFlags, point, KBAN_FUNCTION::mouse_left_up);
- }
-
- void CKBANView::OnLButtonDown(UINT nFlags, CPoint point)
- {
- OnMouseGeneral(nFlags, point, KBAN_FUNCTION::mouse_left_down);
- }
-
- void CKBANView::OnRButtonUp(UINT nFlags, CPoint point)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- if((m_current_mmi != &m_default_func) || info.bCaptured()) {
- OnMouseGeneral(nFlags, point, KBAN_FUNCTION::mouse_right_up);
- } else {
- CClientDC dc(this);
- OnPrepareDC(&dc);
- CPoint lp = point;
- dc.DPtoLP(&lp);
- XY pc(lp.x, lp.y);
- XY ac;
- GRID& grid = info.grid();
- grid.xy_pc2ac(pc, ac);
-
- // what's under the mouse cursor?
- PRIMITIVE& prim = info.kban_data().primitive();
- PIN_LIST& pin_list = prim.layer(info.active_layer().get_pin_layer()).pin_list();
- m_ctxt_target_pin = pin_list.search(ac);
- LINE_LIST& line_list = prim.layer(info.active_layer().get()).line_list();
- m_ctxt_target_line = line_list.search(10, ac);
- COMPONENT_LIST& comp_list = info.kban_data().component_list();
- m_ctxt_target_comp = comp_list.search(ac);
-
- // construct a context menu
- CMenu menu;
- menu.LoadMenu(IDR_CONTEXTMENU);
- CMenu* pContextMenu = menu.GetSubMenu(0);
- if(m_ctxt_target_pin != NULL) {
- pContextMenu->AppendMenu(MF_STRING, ID_CTXT_EDIT_PIN, "Edit Pin");
- }
- if(m_ctxt_target_pin != NULL) {
- pContextMenu->AppendMenu(MF_SEPARATOR);
- }
- if(m_ctxt_target_pin != NULL) {
- if(m_ctxt_target_pin->is_selected()) {
- pContextMenu->AppendMenu(MF_STRING, ID_CTXT_UNSELECT_PIN, "Unselect Pin");
- } else {
- pContextMenu->AppendMenu(MF_STRING, ID_CTXT_SELECT_PIN, "Select Pin");
- }
- }
- if(m_ctxt_target_line != NULL) {
- if(m_ctxt_target_line->is_selected()) {
- pContextMenu->AppendMenu(MF_STRING, ID_CTXT_UNSELECT_LINE, "Unselect Line");
- } else {
- pContextMenu->AppendMenu(MF_STRING, ID_CTXT_SELECT_LINE, "Select Line");
- }
- }
- if(m_ctxt_target_comp != NULL) {
- if(m_ctxt_target_comp->is_selected()) {
- pContextMenu->AppendMenu(MF_STRING, ID_CTXT_UNSELECT_COMPONENT, "Unselect Component");
- } else {
- pContextMenu->AppendMenu(MF_STRING, ID_CTXT_SELECT_COMPONENT, "Select Component");
- }
- }
-
- pContextMenu->RemoveMenu(ID_APP_ABOUT, MF_BYCOMMAND);
- ClientToScreen(&point);
- pContextMenu->TrackPopupMenu(
- TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
- point.x, point.y, this
- );
- menu.Detach();
- }
- }
-
- void CKBANView::OnRButtonDown(UINT nFlags, CPoint point)
- {
- OnMouseGeneral(nFlags, point, KBAN_FUNCTION::mouse_right_down);
- }
-
- void CKBANView::OnContextEditPin()
- {
- PREPARE();
-
- PIN_ELEMENT& target = *m_ctxt_target_pin;
-
- draw.draw_primitive_pin_target(target);
-
- CEditPinDialog dialog(info.apt_pin_table(), target, AfxGetMainWnd());
- draw.draw_primitive_pin_target(target);
- int result = dialog.DoModal();
- draw.erase_primitive_pin(target);
- if(result == IDOK) {
- target = dialog.GetPinElement();
- info.apt_pin_table() = dialog.GetAptTable();
- info.SetModifiedFlag();
- }
- uint layer = info.active_layer().get_pin_layer();
- draw.draw_primitive_pin(target, layer);
- GetDocument()->SetNewState("Edit Pin");
- }
-
- #define UPDATE_bSelected() \
- { \
- KBAN_DATA& kban_data = info.kban_data(); \
- KBAN_DATA kban_data_selected; \
- kban_data.collect_selected_items(kban_data_selected); \
- if(kban_data_selected.empty()) { \
- info.bSelected() = false; \
- } else { \
- info.bSelected() = true; \
- } \
- }
-
- void CKBANView::OnContextSelectPin()
- {
- PREPARE();
- PIN_ELEMENT& target = *m_ctxt_target_pin;
- target.select();
- draw.draw_primitive_pin_target(target);
- info.bSelected() = true;
- GetDocument()->SetNewState("Select Pin");
- }
-
- void CKBANView::OnContextUnselectPin()
- {
- PREPARE();
- PIN_ELEMENT& target = *m_ctxt_target_pin;
- target.unselect();
- draw.draw_primitive_pin(target, info.active_layer().get_pin_layer());
- UPDATE_bSelected();
- GetDocument()->SetNewState("Unselect Pin");
- }
-
- void CKBANView::OnContextSelectLine()
- {
- PREPARE();
- LINE_ELEMENT& target = *m_ctxt_target_line;
- target.select();
- draw.draw_primitive_line_target(target);
- info.bSelected() = true;
- GetDocument()->SetNewState("Select Line");
- }
-
- void CKBANView::OnContextUnselectLine()
- {
- PREPARE();
- LINE_ELEMENT& target = *m_ctxt_target_line;
- target.unselect();
- draw.draw_primitive_line(target, info.active_layer().get());
- UPDATE_bSelected();
- GetDocument()->SetNewState("Unselect Line");
- }
-
- void CKBANView::OnContextSelectComponent()
- {
- PREPARE();
- COMPONENT_ELEMENT& target = *m_ctxt_target_comp;
- target.select();
- draw.draw_one_component_target(target, info.active_layer().get());
- info.bSelected() = true;
- GetDocument()->SetNewState("Select Component");
- }
-
- void CKBANView::OnContextUnselectComponent()
- {
- PREPARE();
- COMPONENT_ELEMENT& target = *m_ctxt_target_comp;
- target.unselect();
- draw.draw_one_component(target, info.active_layer().get());
- UPDATE_bSelected();
- GetDocument()->SetNewState("Unselect Component");
- }
-
- void CKBANView::OnSize(UINT nType, int cx, int cy)
- {
- XY pc_win_size(cx, cy);
- KBAN_INFO& info = GetDocument()->kban_info();
- GRID& grid = info.grid();
- grid.set_pc_win_size(pc_win_size);
- CScrollView::OnSize(nType, cx, cy);
- SetScrollSizes(
- MM_TEXT,
- CSize(grid.get_pc_design_size().x(), grid.get_pc_design_size().y()),
- CSize(pc_win_size.x() / 2, pc_win_size.y() / 2)
- );
- }
-
- void CKBANView::OnMove(int x, int y)
- {
- Invalidate();
- }
-
- void CKBANView::OnVScroll(UINT nCode, UINT nPos, CScrollBar* pScrollBar)
- {
- // m_bDisableRedraw = true;
-
- // To reduce the number of redrawing, Invalidate() must be before
- // calling CScrollView::OnVScroll()
- PREPARE();
- if(m_current_mmi->pre_redraw(info, draw) == FALSE) {
- ChangeCommandCore(info, draw, &m_default_func);
- }
- Invalidate();
- CScrollView::OnVScroll(nCode, nPos, pScrollBar);
-
- m_bDisableRedraw = false;
- }
-
- void CKBANView::OnHScroll(UINT nCode, UINT nPos, CScrollBar* pScrollBar)
- {
- // m_bDisableRedraw = true;
-
- // To reduce the number of redrawing, Invalidate() must be before
- // calling CScrollView::OnHScroll()
- PREPARE();
- if(m_current_mmi->pre_redraw(info, draw) == FALSE) {
- ChangeCommandCore(info, draw, &m_default_func);
- }
- Invalidate();
- CScrollView::OnHScroll(nCode, nPos, pScrollBar);
-
- m_bDisableRedraw = false;
- }
-
- void CKBANView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
- {
- if(!bActivate) {
- Invalidate();
- }
- }
-
- void CKBANView::OnUndo()
- {
- if(GetDocument()->Undo()) {
- Invalidate();
- }
- }
-
- void CKBANView::OnUpdateUndo(CCmdUI* pCmdUI)
- {
- if(GetDocument()->IsUndoable()) {
- pCmdUI->Enable(true);
- char str[100];
- sprintf(str, "Undo %s\tCtrl+Z", GetDocument()->GetUndoName());
- pCmdUI->SetText(str);
- } else {
- pCmdUI->Enable(false);
- pCmdUI->SetText("Undo\tCtrl+Z");
- }
- }
-
- void CKBANView::OnRedo()
- {
- if(GetDocument()->Redo()) {
- Invalidate();
- }
- }
-
- void CKBANView::OnUpdateRedo(CCmdUI* pCmdUI)
- {
- if(GetDocument()->IsRedoable()) {
- pCmdUI->Enable(true);
- char str[100];
- sprintf(str, "Redo %s", GetDocument()->GetRedoName());
- pCmdUI->SetText(str);
- } else {
- pCmdUI->Enable(false);
- pCmdUI->SetText("Redo");
- }
- }
-
- void CKBANView::OnUpdatePaste(CCmdUI* pCmdUI)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- pCmdUI->Enable(info.bClipped());
- }
-
- void CKBANView::OnUpdateUnselectAll(CCmdUI* pCmdUI)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- pCmdUI->Enable(info.bSelected());
- }
-
- void CKBANView::OnZoomCore(UINT nID)
- {
- CPoint point = GetScrollPosition();
- XY pc_win_base(point.x, point.y);
- KBAN_INFO& info = GetDocument()->kban_info();
- GRID& grid = info.grid();
- switch(nID) {
- case ID_VIEW_ZOOMIN : grid.zoom_in (pc_win_base); break;
- case ID_VIEW_ZOOMOUT : grid.zoom_out(pc_win_base); break;
- case ID_VIEW_ALL : {
- XY ac_min = info.kban_data().get_min();
- XY ac_max = info.kban_data().get_max();
- grid.zoom_window(ac_min, ac_max, pc_win_base);
- break;
- }
- }
- const XY& pc_design_size = grid.get_pc_design_size();
- SetScrollSizes(
- MM_TEXT,
- CSize(pc_design_size.x(), pc_design_size.y()),
- CSize(grid.get_pc_win_size().x() / 2, grid.get_pc_win_size().y() / 2)
- );
- ScrollToPosition(CPoint(pc_win_base.x(), pc_win_base.y()));
- Invalidate();
- }
-
- void CKBANView::OnRedraw()
- {
- Invalidate();
- }
-
- void CKBANView::OnChangeSnap()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- info.grid().snap_change();
- }
-
- void CKBANView::OnUpdateSnap(CCmdUI* pCmdUI)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- pCmdUI->SetCheck(info.grid().snap_get());
- }
-
- void CKBANView::OnChangePinOnCommon()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- info.active_layer().pin_on_common().change();
- }
-
- void CKBANView::OnUpdatePinOnCommon(CCmdUI* pCmdUI)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- pCmdUI->SetCheck(info.active_layer().pin_on_common().get());
- }
-
- void CKBANView::OnChangeFill()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- info.fill().change();
- Invalidate();
- }
-
- void CKBANView::OnUpdateFill(CCmdUI* pCmdUI)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- pCmdUI->SetCheck(info.fill().get());
- }
-
- void CKBANView::OnChangeHole()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- info.hole().change();
- Invalidate();
- }
-
- void CKBANView::OnUpdateHole(CCmdUI* pCmdUI)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- pCmdUI->SetCheck(info.hole().get());
- }
-
- void CKBANView::OnHelpDebug()
- {
- CClientDC dc(this);
- OnPrepareDC(&dc);
- int t1 = ::GetCurrentTime();
- for(int i = 0; i < 50; i++) {
- OnEraseBkgnd(&dc);
- OnDraw(&dc);
- }
- int t2 = ::GetCurrentTime();
- int td = t2 - t1;
- char str[300];
- sprintf(str, "Elapsed Time : %d.%03d", td / 1000, td % 1000);
- MessageBox(str, "Elapsed Time");
- }
-
- void CKBANView::OnChangeGrid(UINT nID)
- {
- m_nGridID = nID;
- KBAN_INFO& info = GetDocument()->kban_info();
- GRID& grid = info.grid();
- switch(nID) {
- case ID_SETUP_GRID_10_1 : grid.set_grid_width(1000, 1); break;
- case ID_SETUP_GRID_10_2 : grid.set_grid_width(1000, 2); break;
- case ID_SETUP_GRID_10_5 : grid.set_grid_width(1000, 5); break;
- case ID_SETUP_GRID_10_A : grid.set_grid_width(1000, 10); break;
- case ID_SETUP_GRID_17_1 : grid.set_grid_width(1778, 1); break;
- case ID_SETUP_GRID_17_2 : grid.set_grid_width(1778, 2); break;
- case ID_SETUP_GRID_25_1 : grid.set_grid_width(2540, 1); break;
- case ID_SETUP_GRID_25_2 : grid.set_grid_width(2540, 2); break;
- case ID_SETUP_GRID_25_4 : grid.set_grid_width(2540, 4); break;
- case ID_SETUP_GRID_25_5 : grid.set_grid_width(2540, 5); break;
- case ID_SETUP_GRID_25_A : grid.set_grid_width(2540, 10); break;
- }
- Invalidate();
- }
-
- void CKBANView::OnSetGridWidth()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- GRID& grid = info.grid();
- int main = grid.get_main_grid_width();
- int sub = grid.get_sub_grid_width();
- int div = main / sub;
- CSetGridDialog dlg(this, main, div);
- if(dlg.DoModal() == IDOK) {
- grid.set_grid_width(dlg.main_grid_width(), dlg.div());
- Invalidate();
- }
- }
-
- void CKBANView::OnUpdateGrid(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(pCmdUI->m_nID == m_nGridID);
- }
-
- void CKBANView::OnResetGrid()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- GRID& grid = info.grid();
- grid.set_grid_origin(XY(0, 0));
- Invalidate();
- }
-
- void CKBANView::OnAptPin()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- APT_TABLE& table = info.apt_pin_table();
- APT_TABLE pin_table_purged;
- APT_TABLE line_table_purged;
- info.kban_data().collect_aperture(pin_table_purged, line_table_purged);
- CAptChgPinDialog dlg(this, table, pin_table_purged, info.apt_pin());
- if(dlg.DoModal() == IDOK) {
- table = dlg.apt_table();
- info.apt_pin() = dlg.aperture();
- }
- }
-
- void CKBANView::OnAptLine()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- APT_TABLE& table = info.apt_line_table();
- APT_TABLE pin_table_purged;
- APT_TABLE line_table_purged;
- info.kban_data().collect_aperture(pin_table_purged, line_table_purged);
- CAptChgLineDialog dlg(this, table, line_table_purged, info.apt_line());
- if(dlg.DoModal() == IDOK) {
- table = dlg.apt_table();
- info.apt_line() = dlg.aperture();
- }
- }
-
- void CKBANView::OnChangeLayer(UINT nID)
- {
- m_nLayerID = nID;
- KBAN_INFO& info = GetDocument()->kban_info();
- ACTIVE_LAYER& layer = info.active_layer();
- switch(nID) {
- case ID_LAYER_PCOMMON : layer.set(LAYER_PATTERN_COMMON); break;
- case ID_LAYER_PTOP : layer.set(LAYER_PATTERN_TOP ); break;
- case ID_LAYER_PBOTTOM : layer.set(LAYER_PATTERN_BOTTOM); break;
- case ID_LAYER_STOP : layer.set(LAYER_SILK_TOP ); break;
- case ID_LAYER_SBOTTOM : layer.set(LAYER_SILK_BOTTOM ); break;
- }
- Invalidate();
- }
-
- void CKBANView::OnUpdateLayer(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(pCmdUI->m_nID == m_nLayerID);
- }
-
- void CKBANView::OnChangeShowLayer(UINT nID)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- FLAG* lflags = info.lflags();
- switch(nID) {
- case ID_LAYER_SHOW_PCOMMON : lflags[LAYER_PATTERN_COMMON].change(); break;
- case ID_LAYER_SHOW_PTOP : lflags[LAYER_PATTERN_TOP ].change(); break;
- case ID_LAYER_SHOW_PBOTTOM : lflags[LAYER_PATTERN_BOTTOM].change(); break;
- case ID_LAYER_SHOW_STOP : lflags[LAYER_SILK_TOP ].change(); break;
- case ID_LAYER_SHOW_SBOTTOM : lflags[LAYER_SILK_BOTTOM ].change(); break;
- }
- Invalidate();
- }
-
- void CKBANView::OnUpdateShowLayer(CCmdUI* pCmdUI)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- FLAG* lflags = info.lflags();
- switch(pCmdUI->m_nID) {
- case ID_LAYER_SHOW_PCOMMON : pCmdUI->SetCheck(lflags[LAYER_PATTERN_COMMON].get()); break;
- case ID_LAYER_SHOW_PTOP : pCmdUI->SetCheck(lflags[LAYER_PATTERN_TOP ].get()); break;
- case ID_LAYER_SHOW_PBOTTOM : pCmdUI->SetCheck(lflags[LAYER_PATTERN_BOTTOM].get()); break;
- case ID_LAYER_SHOW_STOP : pCmdUI->SetCheck(lflags[LAYER_SILK_TOP ].get()); break;
- case ID_LAYER_SHOW_SBOTTOM : pCmdUI->SetCheck(lflags[LAYER_SILK_BOTTOM ].get()); break;
- }
- }
-
- void CKBANView::OnEditCutCopyDelete(UINT nID)
- {
- PREPARE();
- if(info.bSelected()) {
- info.bSelected() = false;
- KBAN_DATA& kban_data = info.kban_data();
- KBAN_DATA kban_data_selected;
- kban_data.collect_selected_items(kban_data_selected);
- uint active_layer = info.active_layer().get();
- if(nID == ID_EDIT_COPY) {
- kban_data.unselect();
- draw.draw_kban_data(kban_data_selected, active_layer);
- } else {
- info.SetModifiedFlag();
- kban_data.remove_selected_items();
- draw.erase_kban_data(kban_data_selected, active_layer);
- }
- if(nID != ID_EDIT_DELETE) {
- XY ac_base = kban_data_selected.get_min();
- info.grid().snap_min(ac_base);
- KBAN_DATA& kban_data_clipped = info.clipped_data();
- kban_data_clipped.clear();
- kban_data_selected.shift(- ac_base, kban_data_clipped);
- kban_data_clipped.unselect();
- info.bClipped() = true;
- }
-
- // register undo info
- switch(nID) {
- case ID_EDIT_CUT : GetDocument()->SetNewState("Cut"); break;
- case ID_EDIT_COPY : GetDocument()->SetNewState("Copy"); break;
- case ID_EDIT_DELETE : GetDocument()->SetNewState("Delete"); break;
- }
- }
- }
-
- void CKBANView::OnUpdateCutCopyDelete(CCmdUI* pCmdUI)
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- pCmdUI->Enable(info.bSelected());
- }
-
- void CKBANView::OnEditUnselectAll()
- {
- PREPARE();
- if(info.bSelected()) {
- info.bSelected() = false;
- KBAN_DATA& kban_data = info.kban_data();
- KBAN_DATA kban_data_selected;
- kban_data.collect_selected_items(kban_data_selected);
- uint active_layer = info.active_layer().get();
- draw.draw_kban_data(kban_data_selected, active_layer);
- kban_data.unselect();
- GetDocument()->SetNewState("Unselect All");
- }
- }
-
- void CKBANView::ChangeCommand(KBAN_FUNCTION* func)
- {
- PREPARE();
- ChangeCommandCore(info, draw, func);
- }
-
- void CKBANView::OnChangeCommand(UINT nID)
- {
- switch(nID) {
- case ID_EDIT_BLOCK : ChangeCommand(&m_edit_block ); break;
- case ID_EDIT_BLOCK_LAYER : ChangeCommand(&m_edit_block_layer ); break;
- case ID_EDIT_PASTE : ChangeCommand(&m_edit_paste ); break;
- case ID_EDIT_PIN : ChangeCommand(&m_edit_pin ); break;
- case ID_EDIT_PULL : ChangeCommand(&m_edit_pull ); break;
- case ID_EDIT_DIVIDE : ChangeCommand(&m_edit_divide ); break;
- case ID_EDIT_MOVE_LINE : ChangeCommand(&m_edit_move_line ); break;
- case ID_SETUP_GRID_ORIGIN : ChangeCommand(&m_setup_grid_origin); break;
- case ID_PLACE_PIN : ChangeCommand(&m_place_pin ); break;
- case ID_PLACE_LINE : ChangeCommand(&m_place_line ); break;
- case ID_PLACE_COMPONENT : ChangeCommand(&m_place_component ); break;
- case ID_DELETE_PIN : ChangeCommand(&m_delete_pin ); break;
- case ID_DELETE_LINE : ChangeCommand(&m_delete_line ); break;
- case ID_DELETE_COMPONENT : ChangeCommand(&m_delete_component ); break;
- }
- }
-
- void CKBANView::OnIsEmpty()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- if(info.kban_data().empty()) {
- MessageBox("Empty", "Help - Is Empty");
- } else {
- MessageBox("Not Empty", "Help - Is Empty");
- }
- }
-
- void CKBANView::OnUserMessage(UINT wParam, LONG lParam)
- {
- PREPARE();
- if(m_current_mmi->user_message(info, draw, wParam, lParam) == FALSE) {
- ChangeCommandCore(info, draw, &m_default_func);
- }
- }
-
- void CKBANView::OnToolsPurge()
- {
- KBAN_INFO& info = GetDocument()->kban_info();
- PRIMITIVE& primitive = info.kban_data().primitive();
- int count = 0;
- for(int i = 0; i < LAYER_NUMBER; i++) {
- LINE_LIST& line_list = primitive.layer(i).line_list();
- count += line_list.purge_lines();
- }
- char str[300];
- sprintf(str, "The number of lines eliminated: %d", count);
- MessageBox(str, "Function Purge");
- info.SetModifiedFlag();
- info.new_state().set(true);
- info.new_state_str() = "Tools Purge";
- GetDocument()->SetNewState(info.new_state_str().c_str());
- Invalidate();
- }
-